package controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import pojo.Loaisanpham;
import util.BeanUtil;
import util.MessageNotificationHepler;
import util.SearchVisitor;
import dao.LoaisanphamDAO;
import dao.NhomsanphamDAO;

@ManagedBean(name = "quanLyLoaiSanPhamBean")
@ViewScoped
public class QuanLyLoaiSanPhamBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private List<Loaisanpham> lstLoaiSanPham;

	private String tenLoaiSanPham;
	private int maLoaiSanPham = -1;
	private int maNhomSanPham; // dùng cho action Thêm

	private int maNhomLietKe; // dùng cho action Liệt kê

	private String chuoiTimKiem; // dùng cho action Tìm

	@PostConstruct
	public void init() {
		setLstLoaiSanPham(new ArrayList<Loaisanpham>());
	}

	public void LietKeToanBo() {
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		lstLoaiSanPham = lspdao.getList();
		System.out.println("Loai SP Xong " + lstLoaiSanPham.size());
	}

	public void ThemLoaiSanPham(/* String tenLoaiSanPham, int maNhomSanPham */) {
		System.out.println("Thêm " + getTenLoaiSanPham() + " - "
				+ getMaNhomSanPham());
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		Loaisanpham lsp = new Loaisanpham();
		lsp.setTenloaisanpham(getTenLoaiSanPham());
		lsp.setNhomsanpham((new NhomsanphamDAO()).get(getMaNhomSanPham()));		
		
		try {
			lspdao.saveOrUpdate(lsp);
		} catch (Exception ex) {
			MessageNotificationHepler
					.ShowMessage("Có Lỗi trong việc thực hiện thao tác!");
			return;
		}
		XoaThongTinDangLuuTru();
		lstLoaiSanPham.add(lsp);

		MessageNotificationHepler.ShowMessage(String.format(
				"Loại sản phẩm '%s' thuộc nhom '%s' đã được thêm thành công!",
				lsp.getTenloaisanpham(), lsp.getNhomsanpham().getTennhom()));
	}

	public void SuaLoaiSanPham() {
		System.out.println("Sửa " + getTenLoaiSanPham() + " - "
				+ getMaNhomSanPham());
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		Loaisanpham lsp = lspdao.get(getMaLoaiSanPham());
		lsp.setTenloaisanpham(getTenLoaiSanPham());
		lsp.setNhomsanpham((new NhomsanphamDAO()).get(getMaNhomSanPham()));
		try {
			lspdao.saveOrUpdate(lsp);
		} catch (Exception ex) {
			MessageNotificationHepler
					.ShowMessage("Có Lỗi trong việc thực hiện thao tác!");
			return;
		}
		XoaThongTinDangLuuTru();

		MessageNotificationHepler
				.ShowMessage(String
						.format("Loại sản phẩm '%s' thuộc nhom '%s' đã được Cập nhật thành công!",
								lsp.getTenloaisanpham(), lsp.getNhomsanpham()
										.getTennhom()));
	}

	public void XoaThongTinDangLuuTru() {
		setTenLoaiSanPham(null);
		setMaLoaiSanPham(-1);
		setMaNhomSanPham(1);
		System.out.println("Xóa thông tin !");
	}

	public void LietKeTheoNhom() {
		System.out.println("Liet Ke Nhom: " + getMaNhomLietKe());
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		lstLoaiSanPham = lspdao.GetLoaiSanPhamTheoMaNhom(getMaNhomLietKe(), false);

	}

	public void TimKiem() {
		System.out.println("Tim Kiếm: " + chuoiTimKiem);
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		SearchVisitor sv = new SearchVisitor();
		lspdao.accept(sv, chuoiTimKiem);
		lstLoaiSanPham = sv.getResultLoaiSanPham();
		System.out.println("Tim Kiếm KQ: " + lstLoaiSanPham.size());
	}

	public void Xoa(Loaisanpham lsp) {
		System.out.println("Xóa: " + lsp.getMaloaisanpham());
		LoaisanphamDAO lspdao = new LoaisanphamDAO();

		// lsp.setDaxoa(true);
		lspdao.SetXoaLoaiVaSanPhamTuongUng(lsp);

		lspdao.saveOrUpdate(lsp);

		// Update cho HeaderBean
		((HeaderBean) BeanUtil.findBean("headerBean"))
				.ReloadDanhMucVaLoaiSanPham();

		MessageNotificationHepler.ShowMessage(String.format(
				"Loại sản phẩm '%s' thuộc nhom '%s' đã được xóa thành công!",
				lsp.getTenloaisanpham(), lsp.getNhomsanpham().getTennhom()));
	}

	public void HuyXoa(Loaisanpham lsp) {
		System.out.println("Hủy Xóa: " + lsp.getMaloaisanpham());
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		// lsp.setDaxoa(false);
		lspdao.SetHuyXoaLoaiVaSanPhamTuongUng(lsp);
		lspdao.saveOrUpdate(lsp);

		// Update cho HeaderBean
		((HeaderBean) BeanUtil.findBean("headerBean"))
				.ReloadDanhMucVaLoaiSanPham();

		MessageNotificationHepler
				.ShowMessage(String
						.format("Loại sản phẩm '%s' thuộc nhom '%s' đã được phục hồi thành công!",
								lsp.getTenloaisanpham(), lsp.getNhomsanpham()
										.getTennhom()));
	}

	// -----------------
	public void SetMaLoaiAndGetData(int maLoaiSP) {
		setMaLoaiSanPham(maLoaiSP);
		LoaisanphamDAO lspdao = new LoaisanphamDAO();
		Loaisanpham lsp = lspdao.get(maLoaiSP);
		setTenLoaiSanPham(lsp.getTenloaisanpham());
		setMaNhomSanPham(lsp.getNhomsanpham().getManhom());
		System.out.println("Lấy thông tin: " + getTenLoaiSanPham());
	}

	// -----------------
	public List<Loaisanpham> getLstLoaiSanPham() {
		return lstLoaiSanPham;
	}

	public void setLstLoaiSanPham(List<Loaisanpham> lstLoaiSanPham) {
		this.lstLoaiSanPham = lstLoaiSanPham;
	}

	public String getTenLoaiSanPham() {
		return tenLoaiSanPham;
	}

	public void setTenLoaiSanPham(String tenLoaiSanPham) {
		this.tenLoaiSanPham = tenLoaiSanPham;
		// System.out.println("Set Xong: " + tenLoaiSanPham);
	}

	/**
	 * @return the maNhomLietKe
	 */
	public int getMaNhomLietKe() {
		return maNhomLietKe;
	}

	/**
	 * @param maNhomLietKe
	 *            the maNhomLietKe to set
	 */
	public void setMaNhomLietKe(int maNhomLietKe) {
		this.maNhomLietKe = maNhomLietKe;
	}

	/**
	 * @return the chuoiTimKiem
	 */
	public String getChuoiTimKiem() {
		return chuoiTimKiem;
	}

	/**
	 * @param chuoiTimKiem
	 *            the chuoiTimKiem to set
	 */
	public void setChuoiTimKiem(String chuoiTimKiem) {
		this.chuoiTimKiem = chuoiTimKiem;
	}

	public int getMaLoaiSanPham() {
		return maLoaiSanPham;
	}

	public void setMaLoaiSanPham(int maLoaiSanPham) {
		this.maLoaiSanPham = maLoaiSanPham;
	}

	public int getMaNhomSanPham() {
		return maNhomSanPham;
	}

	public void setMaNhomSanPham(int maNhomSanPham) {
		this.maNhomSanPham = maNhomSanPham;
	}

}
